13
תגובות
שלום לכולם, לצורך העניין יש לי את הטבלה הבאה:
+-----+-----+
| [u][b]id[/b][/u]  | [u][b]num[/b][/u]  |
+-----+-----+
|    5  |   1   |
+-----+-----+
|    6  |   2   |
+-----+-----+

num is unique


אני מציג למשתמש את הטבלה כדי שיבחר אילו שינויים לבצע והוא עורך את הטבלה ומגיש את הטופס.
עכשיו במקרה שלדוגמה לשורה הראשונה הוא נתן num=6 ולשורה השנייה נתן num=5, השאילתה שהסקריפט יוצר תהיה כזו:
UPDATE `table` SET `num`=CASE `id` WHER '1' THEN '6' WHEN '2' THEN '5' END WHERE `id` IN('1','2')

עכשיו הבעיה עם השאילתה היא שהיא נותנת שגיאה כי ברגע שהסקריפט מעדכן את השורה הראשונה ושם בה 6 יש בעיה, כי num הוא unique ואז יש התנגשות עם ה-num של השורה השנייה ומוחזרת שגיאה.

יש דרך לפתור את זה בלי הרבה שאילתות?

13 תשובות

avatar ענה iiddaannyy ב 10 למרץ 2012 #

הטבלה:

+-----+-----+
| id  | num |
+-----+-----+
|  1  |  5  |
+-----+-----+
|  2  |  6  |
+-----+-----+

num is unique

avatar ענה intval ב 10 למרץ 2012 #

קודם למחוק מהטבלה את הערכים שהוא שינה ואז להכניס אותם מחדש.

delete from table where id in $changed_ids

insert into tbl (id, num) values (1,6), (2,5), (3,7), ..

תעשה את זה בטראנזקציה, ככה שאם אחד ה num לא יהיה יוניקי - ישארו לך הערכים הישנים ותוכל לתת על זה הודעת שגיאה.

avatar ענה iiddaannyy ב 10 למרץ 2012 #

הבעיה היא שה-id מכוון ל-auto increment וכשאני מכניס id ידנית זה דופק את זה וה-id שיכנס אחריו יהיה לא בסדר הנכון..

avatar ענה intval ב 10 למרץ 2012 #

א. זה לא
ב. מה הבעיה עם זה שיהיו חורים ברשימת ה id ?

avatar ענה iiddaannyy ב 10 למרץ 2012 #

זה כן.
הייתה לי טבלה עם שתי שורות, ה-idים הם 1 ו-2, כשהכנסתי שורה חדשה עם id=6, השורה הבאה שהכנסתי הייתה עם id=7.

וכן, נכון שאין בעיה עם חורים ב-id.


בכל מקרה מחקתי את ה-unique, הוא אמנם יכול לעזור במקרים מסוימים, אבל גם אם יהיו שתי שורות עם אותו ערך בעמודה הזו הסקריפט יתמודד. זה עדיף לי במקרה הזה.


תודה רבה. :)

avatar ענה intval ב 10 למרץ 2012 #

תנסה שוב. auto_increment לא עולה עם אתה מכניס ערך שהוא יותר נמוך מה auto_increment הבא.

avatar ענה iiddaannyy ב 10 למרץ 2012 #

כן, נכון, טעיתי אתה צודק. :)

בכל מקרה זה כבר לא משנה כי ביטלתי את ה-unique.

avatar ענה intval ב 10 למרץ 2012 #

חבל :)
חוץ מזה לעשות שאילתות עם כל הקייסים האלה זה רעיון לא ממש טוב.

avatar ענה iiddaannyy ב 10 למרץ 2012 #

אבל זה עדיף על פני הרבה שאילתות update...

avatar ענה intval ב 11 למרץ 2012 #

זה שאילתת insert אחת בסה"כ.

avatar ענה iiddaannyy ב 11 למרץ 2012 #

הטבלה שלי מכילה יותר עמודות, לכן אני צריך:
1. שאילתת select ששולפת את יתר העמודות.
2. שאילתת delete.
3. שאילתת insert.

בכל מקרה דיברתי על ה-update שעשיתי בהתחלה ושהוא עדיף על פני הרבה updateים.
אני אעשה יותר מאוחר בדיקה כדי לראות מה יותר כדאי, 3 שאילתות; select, delete, insert או שאילתת update עם הרבה caseים.

avatar ענה cthulhu ב 11 למרץ 2012 #

תנאים כאלה ממש לא רצויים בשאילתות. צריך לעשות הפרדה בין ה"שכבות הלוגיות" מה שנקרא. אין לזה השפעה ממשית במקרה של משהו נקודתי, ואם אין מערכים גדולים, אבל זה כן יכול להשפיע במקרה ויש לך הרבה מידע והרבה מניפולציות עליו. כמו כן, זה הופך את הקוד לפחות גמיש. זה גם יכול ליצור בעיות תאימות בין מסדים. לכן זה באמת רעיון לא טוב.

avatar ענה iiddaannyy ב 11 למרץ 2012 #

עברתי ל-select, delete ו-insert.

תודה רבה. :)